這個問題已經在這裡有了答案: 重載運算符中沒有隱式轉換 (2個答案) 7年前關閉。 我正在為基本類型編寫一個簡單的包裝程序,並試圖避免不得不編寫太多標準操作符。我希望隱式類型轉換會有所幫助,但沒有幫助。這是一個簡化的示例: struct Int { int _i; Int(int i = 0):_i {i} {} Int運算符+(const Int&rhs){返回_i + rhs._i;} }; int main(int argc,char * argv []) { (無效)(Int(1)+ 2); // 美好的 (無效)(2 + Int(1)); //錯誤:對二進製表達式無效的操作數(“ int”和“ Int”) } 我正在使用llvm。第一行主要編譯良好。第二個導致錯誤。現在,我希望在第二行中發生的是將2隱式轉換為Int(2),然後再調用operator +。為什麼不發生這種情況?為什麼第一行會發生隱式轉換?
2021-03-01 08:16:59
它發生在第一行,因為唯一可用的operator +是operator +(Int&)(對於此實例,它具有隱式的Int第一參數)。第二行失敗,因為第一個參數是int,並且不知道在嘗試操作之前需要對其進行轉換(它不知道需要使用Int :: operator +)。 您可以通過使操作員成為非成員朋友功能來避免該問題(http://ideone.com/YCf7wX) struct Int { int _i; Int(int i = 0):_i {i} {} 朋友Int運算符+(const Int&lhs,const Int&rhs); }; Int運算符+(const Int&lhs,const Int&rhs) { 返回lhs._i + rhs._i; } int main() { 詮釋 我+ 5; 5 +我; 返回0; } | 不是您要找的答案?瀏覽標記為c ++運算符關鍵字隱式轉換的其他問題,或者提出您自己的問題。